package FileAndRecurison.Filter过滤器;

import java.io.File;

/*
        File[]	listFiles(FileFilter filter)        返回抽象路径名数组，这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。
        File[]	listFiles(FilenameFilter filter)    返回抽象路径名数组，这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。

    java.io.FileFilter接口：用于抽象路径名（File对象）的过滤器
        作用：用来过滤文件（file对象）
        抽象方法：用来过滤文件的方法
        boolean	accept(File pathname)   测试指定抽象路径名是否应该包含在某个路径名列表中。
        参数：
            File pathname：使用listfile方法遍历目录得到的文件对象

     java.io.FilenameFilter接口： 实现此接口的类实例可用于过滤器文件名
        作用：用来过滤文件名称
        抽象方法：用来过滤文件的方法
         boolean accept(File dir, String name) 测试指定文件是否应该包含在某一文件列表中。
         参数：
            File dir：构造方法中传递的被遍历的目录
            String name：使用listfile方法遍历目录得到的文件/文件夹的名称

      注意：
            两个过滤器接口是没有实现类的，需要自己写实现类，重写过滤的方法accept，在方法中自定义过滤的规则
*/
public class FilterTest02lambda表达式 {
    public static void main(String[] args) {
        printDir("/Users/ivy/Documents/java/mydir");
    }

    private static void printDir(String s) {
        File file = new File(s);
        //传递过滤器对象
        //此处使用lambda表达式，直接再次重写accept方法

        //未简化版本如下
        //File[] files = file.listFiles((File pathname) -> {return pathname.toString().toLowerCase().endsWith(".java") || pathname.isDirectory();});
        //简化版本如下
        File[] files = file.listFiles(pathname -> pathname.toString().toLowerCase().endsWith(".java") || pathname.isDirectory());
/*
        FileFilter的运行机制
        1、listFiles对构造方法传递的目录进行遍历，获取目录中的每一个文件/文件夹——>封装为File对象
        2、listFiles方法会调用FileFilter过滤器中accept方法
        3、listFiles方法会把遍历得到的每一个file对象，作为参数传递给accept
        4、accept方法会进行过滤，满足过滤条件返回true，否则返回false
        5、如果返回true，file对象存放至File[]数组
*/
        for (
                File file1 : files) {
            if (file1.isDirectory()) {
                printDir(file1.toString());
            } else {
                System.out.println(file1);
            }
        }

    }
}
